1 /*
2 Copyright: Marcelo S. N. Mancini (Hipreme|MrcSnm), 2018 - 2021
3 License:   [https://creativecommons.org/licenses/by/4.0/|CC BY-4.0 License].
4 Authors: Marcelo S. N. Mancini
5 
6 	Copyright Marcelo S. N. Mancini 2018 - 2021.
7 Distributed under the CC BY-4.0 License.
8    (See accompanying file LICENSE.txt or copy at
9 	https://creativecommons.org/licenses/by/4.0/
10 */
11 module hip.hipaudio.backend.openal.clip;
12 
13 version(OpenAL):
14 import hip.audio_decoding.audio;
15 import hip.hipaudio.audio;
16 import hip.hipaudio.audiosource;
17 import hip.hipaudio.backend.openal.player;
18 import bindbc.openal;
19 import hip.hipaudio.backend.openal.al_err;
20 
21 /** 
22  * OpenAL Buffer works in the following way:
23  * If the buffer is streamed, it won't be owned by any source, so it will have total control
24  * over itself. That way, it can be reused by any source.
25  *
26  * Else, the buffer will be owned by the source for decoding, updating, and pulling data.
27  *
28  */
29 public class HipOpenALClip : HipAudioClip
30 {
31     this(IHipAudioDecoder decoder, HipAudioClipHint hint){super(decoder, hint);}
32     this(IHipAudioDecoder decoder, HipAudioClipHint hint, uint chunkSize){super(decoder, hint, chunkSize);}
33     
34     override void onUpdateStream(ubyte[] data, uint decodedSize){}
35 
36     /** Allocates ALuint in the bufferwrapper */
37     override HipAudioBufferWrapper createBuffer(ubyte[] data)
38     {
39         // import hip.console.log;
40         HipAudioBufferWrapper w;
41         alGenBuffers(1, &w.buffer.al);
42         alCheckError("Error generating OpenAL Buffer");
43         hasBuffer = true;
44         return w;
45     }
46 
47     override void destroyBuffer(HipAudioBuffer* buffer)
48     {
49         alDeleteBuffers(1, &buffer.al);
50         alCheckError("Error deleting OpenAL Buffer");
51     }
52 
53     override void setBufferData(HipAudioBuffer* buffer, ubyte[] data, uint size = 0)
54     {
55         alBufferData(
56             buffer.al,
57             HipOpenALAudioPlayer.config.getFormatAsOpenAL,
58             data.ptr,
59             size == 0 ? cast(int)data.length : size,
60             decoder.getSamplerate()
61         );
62         alCheckError("Error setting OpenAL Buffer Data");
63     }
64 
65     bool hasBuffer;
66 
67 }